07 de Junio, 2017

Contenido

1. Customizar apariencia

HTML & CSS

Comandos HTML

Shiny acepta código HTML
ui <- fluidPage(
  HTML("<h1>Título hecho con HTML</h1>")
)

server <- function(input, output) {}

shinyApp(ui, server)
R permite añadir contenido a una página con las funciones tags
ui <- fluidPage(
  tags$h1("Título hecho con R")
)

server <- function(input, output) {}

shinyApp(ui, server)

tags: h1() - h6()

Tamaño del texto introducido

ui <- fluidPage(
  h1("Tamaño 1"),
  h2("Tamaño 2"),
  h3("Tamaño 3"),
  h4("Tamaño 4"),
  h5("Tamaño 5"),
  h6("Tamaño 6")
)

server <- function(input, output) {}

shinyApp(ui, server)

tags: hr()

Línea horizontal

ui <- fluidPage(
  h3("texto"),
  hr(),
  h3("texto")
)

server <- function(input, output) {}

shinyApp(ui, server)

tags: "Texto"

Texto normal. El texto plano sin modificadores no necesita tags.

ui <- fluidPage(
  "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed eiusmod tempor incidunt ut labore et dolore magna aliqua."
)

server <- function(input, output) {}

shinyApp(ui, server)

tags: br()

Salto de línea

ui <- fluidPage(
  "Texto 1",
  br(),
  "Texto 2"
)

server <- function(input, output) {}

shinyApp(ui, server)

tags: p()

Párrafo

ui <- fluidPage(
  p("Párrafo 1"),
  p("Párrafo 2")
)

server <- function(input, output) {}

shinyApp(ui, server)

tags: em()

Letra en itálica/cursiva

ui <- fluidPage(
  em("itálica")
)

server <- function(input, output) {}

shinyApp(ui, server)

tags: strong()

Letra en negrita

ui <- fluidPage(
  strong("negrita")
)

server <- function(input, output) {}

shinyApp(ui, server)

tags: code()

Texto monoespaciado. Típicamente se emplea este comando para introducir código

ui <- fluidPage(
  code("código")
)

server <- function(input, output) {}

shinyApp(ui, server)

Los tags se pueden anidar unos dentro de otros.

ui <- fluidPage(
  p("Lorem ipsum dolor sit amet, ", strong("consectetur"), " adipiscing elit, ", em("sed eiusmod tempor incidunt ut labore et dolore magna aliqua."))
)

server <- function(input, output) {}

shinyApp(ui, server)

tags que soporta Shiny

Insertar un CSS

Las hojas de estilo en cascada (CSS) son un marco para personalizar la apariencia de elementos en una página web.

ui <- fluidPage(
  theme = "bootstrap.css",
  sidebarLayout(
    sidebarPanel(),
    mainPanel()
  )
)

server <- function(input, output) {}

shinyApp(ui, server)
ui <- fluidPage(
  includeCSS("bootstrap.css"),
  sidebarLayout(
    sidebarPanel(),
    mainPanel()
  )
)

server <- function(input, output) {}

shinyApp(ui, server)

2. Extensiones a Shiny (mediante paquetes)

2. Extensiones a Shiny (mediante paquetes)

  • Extensiones de formato

    • flexdashboard: Tableros interactivos fáciles para R (RMarkdown)
    • shinythemes: Temas CSS listos para usar con Shiny
    • shinydashboard: Tableros para Shiny
    • shinyjqui: Interacciones y efectos de animación para Shiny
  • Extensiones para cálculos/gráficos interactivos

    • htmlwidgets: Un marco para embeber visualizaciones de JavaScript en R

flexdashboard

  • Formalmente es un RMarkdown (documento interactivo) con elementos de Shiny
  • Muy buena combinación con Github
  • Redes sociales (Twitter, Facebook, Google+, LinkedIn and Pinterest)
  • Posibilidad de incrustar código

flexdashboard

  • RStudio nos da la opción de abrir un template para Flex Dashboard al indicar que queremos un New R Markdown

shinythemes

library(shiny); library(shinythemes)

shinyApp(
  ui = fluidPage(theme = shinytheme("cyborg"),
    ...
  ),
  server = function(input, output) { }
)

shinydashboard








library(shiny); library(shinydashboard)

ui <- dashboardPage(
  dashboardHeader(),
  dashboardSidebar(),
  dashboardBody()
)

server <- function(input, output) { }

shinyApp(ui, server)
  • Diferentes colores (skins) para el tema
  • Utilización de iconos 1 y 2

shinyjqui

htmlwidgets

87 widgets registrados actualmente (selección):

  • leaflet: Mapeado geoespacial interactivo
  • plotly: Creación de gráficos interactivos
  • dygraphs: Graficado de series temporales
  • networkD3: Visualización gráfica de datos con D3
  • DataTables: Visualización de datos tabulares
  • d3heatmap: Mapas de calor
  • DiagrammeR: Grafos y diagramas de flujo
  • rglwidget: Renderiza escenas creadas con rgl

Leaflet: mapas interactivos

  • Llamadas en Shiny: renderLeaflet() y leafletOutput()
  • Tiles
library(leaflet)
leaflet() %>% addTiles() %>% addMarkers(lng=-0.3531, lat=39.4815, popup="FISABIO")

Plotly: Navaja suiza de gráficos interactivos

  • Llamadas en Shiny: renderPlotly() y plotlyOutput()
library(ggplot2, plotly)
p <- ggplot(data = diamonds, aes(x = cut, fill = clarity)) + geom_bar(position = "dodge")
ggplotly(p)

dygraphs: Gráficos interactivos para series temporales

  • Llamadas en Shiny: renderDygraph() y dygraphOutput()
library(dygraphs)
lungDeaths <- cbind(ldeaths, mdeaths, fdeaths)
dygraph(lungDeaths, main = "Deaths from Lung Disease (UK)") %>%
  dyHighlight(highlightCircleSize = 5, 
              highlightSeriesBackgroundAlpha = 0.2,
              hideOnMouseOut = FALSE)

networkD3: Grafos interactivos

  • Llamadas en Shiny: renderForceNetwork() y forceNetworkOutput()
library(networkD3)
data(MisLinks, MisNodes)
forceNetwork(Links = MisLinks, Nodes = MisNodes, Source = "source", Target = "target", Value = "value", NodeID = "name", Group = "group", opacity = 0.4)

DataTable: Tablas dinámicas (paquete DT)

  • Llamadas en Shiny: renderDataTable() y dataTableOutput()
DT::datatable(iris, options = list(pageLength = 3, dom = "pt", language = list(url = '//cdn.datatables.net/plug-ins/1.10.11/i18n/Spanish.json')), rownames = FALSE, escape = FALSE)

d3heatmap

  • Llamadas en Shiny: renderD3heatmap() y d3heatmapOutput()
library(d3heatmap)
d3heatmap(mtcars, scale = "column", colors = "Spectral")

DiagrammeR: Grafos y diagramas de flujo

rglwidget

library(rgl); library(rglwidget); library(htmltools)

theta <- seq(0, 6*pi, len=100)
xyz <- cbind(sin(theta), cos(theta), theta)
lineid <- plot3d(xyz, type="l", alpha = 1:0, lwd = 5, col = "blue")["data"]

browsable(tagList(
  rglwidget(elementId = "example", width = 500, height = 400,
            controllers = "player"),
  playwidget("example", 
             ageControl(births = theta, ages = c(0, 0, 1),
                        objids = lineid, alpha = c(0, 1, 0)),
                        start = 1, stop = 6*pi, step = 0.1, 
                        rate = 6,elementId = "player")))

y muchos más en http://gallery.htmlwidgets.org/


3. Compartir las apps creadas con Shiny

3. Compartir las apps creadas con Shiny…

de forma local, con alguien que tiene R en su ordenador.

  • runUrl(), runGitHub() o runGist()

de forma global, con todo el mundo (sin necesidad de tener R).

  • shinyapps.io
  • Shiny Server
  • RStudio Connect

Compartir apps Shiny

local

runUrl()

  • Comprimir la carpeta de la app en un zip y enlazar el archivo en una web
runUrl( "<link a la web>")

runGitHub()

  • Alojar tu app en tu repositorio libre de GitHub
runGitHub( "<nombre de tu repositorio>", "<tu nombre de usuario>") 

runGist()

  • Alojar tu app en tu repositorio libre de GitHub, manteniendo tu anonimato con Gist

  • Subir los archivos a Gist
  1. Gist nos dará una Url
  2. Los números finales de la Url son el código gist
runGist("código gist")

Compartir apps Shiny

global

shinyapps.io

Shiny Server

RStudio Connect

Comparativa características

4. MapEs (una app desarrollada por FISABIO - DG Salud Pública)

MapEs

Bibliografía y recursos

RStudio. 2016a. “Hoja de referencia de Shiny.” https://www.rstudio.com/wp-content/uploads/2015/03/shiny-spanish.pdf.

———. 2016b. “Shiny - Tutorial.” https://shiny.rstudio.com/tutorial/lesson1/.

RStudio Team. 2016. RStudio: Integrated Development Environment for R. Boston, MA: RStudio, Inc. http://www.rstudio.com/.

Shi, Kejia. 2017. “Leaflet Cheat Sheet: Leaflet for R.” https://github.com/rstudio/cheatsheets/raw/master/source/pdfs/leaflet cheat sheet.pdf.

Wickham, H. 2015. Advanced R. Boca Raton, FL: CRC.